package javase_class_250905;

/**
 * ClassName: StaticMethodTest
 * Package: javase_class_250905
 * Description:
 *
 * @Author harkjeans
 * @Create 2025/9/5 15:09
 * @Version 1.0
 */
/**
 * 有 static 修饰的方法（静态方法）属于类本身。
 * 没有 static 修饰的方法（实例方法）属于类的每个对象（实例）。
 *
 * 实例方法内部有一个隐式的 this 参数，指向调用该方法的对象。这使得方法可以区分不同对象的属性。
 * 静态方法内部没有 this。因为它们根本不依赖于任何特定的对象，所以也不知道 this 应该指向谁。
 *
 * 实例方法可以访问所有成员：既可以操作属于对象的实例成员，也可以操作属于类的静态成员。
 * 静态方法只能访问静态成员：它只能操作其他静态变量和调用其他静态方法。它不能直接访问任何实例成员，
 * 因为实例成员依附于对象，而调用静态方法时，可能根本不存在任何对象！
 *
 * public static void main(String[] args) 方法就是一个典型的静态方法。
 * 这也解释了为什么你在 main 方法中不能直接调用同类中的其他实例方法或变量，必须先创建该类的一个对象。
 */
public class StaticMethodTest {
    public static void main(String[] args) {
        // 调用静态方法：使用【类名.方法名()】
        int product = Calculator.multiply(5, 3); // 正确！不需要创建对象
        System.out.println(product); // 输出：15

        // 调用实例方法：必须先创建对象，使用【对象.方法名()】
        // Calculator.add(2, 2); // 编译错误！无法从静态上下文中引用非静态方法
        Calculator myCalc = new Calculator();
        int sum = myCalc.add(5, 3);
        System.out.println(sum); // 输出：8
    }
}
class Calculator {
    // 实例变量，属于每个Calculator对象
    int memory = 0;

    // 静态变量，属于Calculator类
    static final double PI = 3.14159;

    // 实例方法 - 无static
    public int add(int a, int b) {
        // 可以访问实例变量
        this.memory = a + b;
        return this.memory;
    }

    // 静态方法 - 有static
    public static int multiply(int a, int b) {
        // 不能访问实例变量或实例方法！
        // this.memory = a * b; // 编译错误！因为不存在this
        // add(a, b);           // 编译错误！

        // 可以访问静态变量
        System.out.println("PI is: " + PI);
        return a * b;
    }
}